import os
import cv2
import numpy as np
from PIL import Image, ImageDraw, ImageFont


def draw_face_boxes(image, face_locations, face_names):
    """
    在图像上绘制人脸框和标签

    Args:
        image: 图像数组
        face_locations: 人脸位置列表 [(top, right, bottom, left), ...]
        face_names: 对应的人名列表

    Returns:
        标注了人脸框和标签的图像
    """
    for (top, right, bottom, left), name in zip(face_locations, face_names):
        # 绘制人脸框
        cv2.rectangle(image, (left, top), (right, bottom), (0, 0, 255), 2)
        cv2.rectangle(image, (left, bottom - 35), (right, bottom), (0, 0, 255), cv2.FILLED)
        
        # 使用PIL处理中文文本显示
        image = put_chinese_text(image, name, (left + 6, bottom - 30), 20, (255, 255, 255))
    
    return image


def put_chinese_text(img, text, position, fontsize, color):
    """
    在图像上绘制中文文本
    
    Args:
        img: 输入图像
        text: 要绘制的文本
        position: 文本位置 (x, y)
        fontsize: 字体大小
        color: 文本颜色 (B, G, R)
        
    Returns:
        绘制了文本的图像
    """
    # 将OpenCV图像转换为PIL图像
    img_pil = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))
    
    # 设置字体
    try:
        # 尝试使用系统中文字体
        font = ImageFont.truetype("simhei.ttf", fontsize, encoding="utf-8")
    except:
        # 如果找不到中文字体，则使用默认字体
        font = ImageFont.load_default()
    
    # 创建绘图对象
    draw = ImageDraw.Draw(img_pil)
    
    # 绘制文本
    draw.text(position, text, font=font, fill=color)
    
    # 将PIL图像转换回OpenCV图像
    img_cv = cv2.cvtColor(np.asarray(img_pil), cv2.COLOR_RGB2BGR)
    
    return img_cv


def save_labeled_image(image, output_path: str) -> bool:
    """
    保存标注了人脸的图像

    Args:
        image: 图像数组
        output_path (str): 输出路径

    Returns:
        bool: 是否保存成功
    """
    try:
        # 处理中文文件名保存问题：使用了cv2.imwrite，这可能会导致中文文件名保存问题。
        is_success, im_buf_arr = cv2.imencode(".jpg", image)
        if is_success:
            im_buf_arr.tofile(output_path)
            return True
        else:
            print("图像编码失败")
            return False
    except Exception as e:
        print(f"保存图像时出错: {e}")
        return False


def create_faces_directory() -> str:
    """
    创建用于存储人脸图像的目录

    Returns:
        str: 人脸图像目录路径
    """
    faces_dir = os.path.join(os.getcwd(), "faces")
    if not os.path.exists(faces_dir):
        os.makedirs(faces_dir)
    return faces_dir


